import java.util.List;

/**
 * Klasa opisujaca instancje chromosomu. Chromosom zawiera kod bianrny oraz
 * wartosc funkcji przystosowania.
 * 
 * @author Ewa Byra (nr indeksu s6405)
 * 
 */
public class Chromosome {
	private String binaryCode;
	private int fitness;

	/**
	 * Konstruktor klasy. Przypisuje parametry do atrubutow klasowych.
	 * 
	 * @param binaryCode
	 *            Kod bianrny chromosomu.
	 * @param data
	 *            Zbior instancji problemu uzywany do obliczania wartosci przystosowania.
	 */
	public Chromosome(String binaryCode, List<Integer> data) {
		this.binaryCode = binaryCode;
		this.fitness = getFitness(data);
	}

	/**
	 * Metoda zwracajaca kod binarny chromosomu.
	 * 
	 * @return Kod binarny chromosomu.
	 */
	public String getBinaryCode() {
		return binaryCode;
	}

	/**
	 * Metoda zwraca wartosc funkcji przystosowania.
	 * 
	 * @return Wartosc fukcji przystosowania.
	 */
	public int getFitness() {
		return fitness;
	}
	

	/**
	 * Metoda obliczajaca funcje przystosowania chromosomu. Funkcja celu jest
	 * modul roznicy sum podzbiorow. Zapis binarny chromosomu oznacza:<br>
	 * a) 0 - element, o tym samym indeksie w zbiorze, na ktorym znajduje sie
	 * gen, wystepuje w pierwszym podzbiorze.<br>
	 * b) 1 - element, o tym samym indeksie w zbiorze, na ktorym znajduje sie
	 * gen, wystepuje w drugim podzbiorze.<br>
	 * Przyklad:<br>
	 * Zbior ma nastepujace emenety: [1,2,3,4,5].<br>
	 * Kod binarny chromosomu to: 01010.<br>
	 * Po rozkodowaniu mamy dwa nastepujace podzbiory: [1,3,5] i [2,4].<br>
	 * 
	 * @param chromosomeCode
	 *            Kod chromosomu, ktoremu obliczana bedzie funkcja
	 *            przystosowania.
	 * @return Wartosc funkcji przystosowania.
	 */
	private int getFitness(List<Integer> data) {
		int fitness = 0;
		int element;

		for (int i = 0; i < data.size(); i++) {
			element = data.get(i);
			if (binaryCode.charAt(i) == '0')
				fitness -= element;
			else
				fitness += element;
		}

		if (fitness < 0)
			fitness = fitness * (-1);

		return fitness;
	}

}
